package com.design.BuilderMode.mode;

/**
 * 建造者模式
 *      将一个复杂对象的构建与它的表示分离，使得同样的构建过程可以创建不同的表示
 *
 *      建造者模式的参数校验放在了build()方法中，这样做法的好处在于build是集中的处理参数问题，
 *      只有校验通过之后才会给ThreadConfig对象实例化，为了对象的安全性，
 *      我们可以将ThreadConfig的构造函数设置成private，
 *      同时取消set方法，强制使用builder方式创建对象，这样就大大的保证了对象的安全性。
 * Lombok中的@Builder就是建造者模式 只是没有条件判断
 *
 * 构造函数与建造者对比
 *      构造函数适用于参数较少，逻辑简单的对象创建，对于参数过多的对象创建可能会造成参数错乱的问题而导致诡异bug。
 *      建造者适用于参数较多，逻辑判断较复杂的对象创建，可以让代码简洁明了，但是对象的代码增加了很多冗余字段。
 *
 * 什么时候用？
 *      必填的字段很多，这样会导致构造函数参数过长的问题。
 *      如果属性与属性之间关联性很强，比如设置了核心线程数就必须要设置最大线程数，这种情况下set方法是无法做到校验的。
 *      如果当前对象比较重要，我们希望对象被创建之后就不能被修改，所以这时候set方法就会被屏蔽，如果利用构造函数，又会出现字段过多问题。
 */
public class main {

    // 传参的时候注意顺序 否则判断时会出现空指针
    public static void main(String[] args) throws IllegalAccessException {
        final ThreadConfig config = ThreadConfig.builder()
                .threadName("hello")
                .corePoolSize(3)
                .maxPoolSize(10)
                .keepAliveTime(100)
                .queueCapacity(2)
                .allowCoreThreadTimeout(true)
                .builder();
        System.out.println(config);
    }

}
